/**
 * 从URL地址中获取指定名称的参数
 * @param {String} key 要获取参数名称
 * @returns 
 */
 function getUrlParam(key){
    var result;
    // 截取字符串
    location.search.substr(1).split('&').forEach(function(item){
        var keyValue = item.split('=');
        if(keyValue[0] == key){
            result = keyValue[1];
        }
    })
    return result;
}

//处理时间的函数
function format(time){
    let d = new Date();
    d.setTime(time*1000);
    return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();
}

/**
 * 发送Ajax请求
 * @param {Object} options 发送请求参数
 */
 function ajax(options){
        //1、默认配置信息
        let config = {
            url:'',  //表示请求地址
            type:'get',  //表示请求方式
            data:'',  //表示请求额外携带的参数，可以是字符串类型，也可是对象类型
            contentType:'application/x-www-form-urlencoded',  //表示设置请求头content-type 对应的值
            dataType:'json', //表示服务端响应的数据结果 的默认数据格式
            success:function(){}//表示拿到服务端响应结果后的处理方式，如何用这个响应数据；是一个回调函数，用户自己决定如何用这个数据
        }



        //2、默认配置的合并
        //用户传递进来的实参 和 默认的信息 两者的处理
        for(let key in config){
            //检查 options中是否有传递对应key值 的属性，如果用户传递进来的实参有，就覆盖默认的config 里key的属性值
            //短路运算
            options[key] && (config[key] = options[key]);
        }
        //如果没有url ，判断一下，抛出错误
        //验证url 考虑可能存在前端与后端在同一个目录下，可以省略http 之类的。所以url 只限制必须传递
        if(!config.url){
            throw  new Error('url必须传递!');
        }
        
        //验证请求方式
        //存储容许的请求方式，用于后面判断请求方式是否错误
        let allowType = ['get','post','put','delete'];

        //将请求方式转换为小写
        config.type = config.type.toLowerCase();

        //判断请求方式是否错误，抛出错误
        if(!allowType.includes(config.type)){
            throw new Error('请求方式设置错误');
        }

        //验证请求携带的参数，要求请求参数格式只能是字符串或者对象
        let dataType = Object.prototype.toString.call(config.data);
        if(dataType != '[object String]' && dataType != '[object Object]'){
            throw new Error('请求数据格式错误');
        }




        //验证回调函数，要求传进来的必须是函数
        if(Object.prototype.toString.call(config.success) != '[object Function]'){
            throw new Error('回调必须是一个函数');
        }

        //构建请求携带的参数，config.data 可能是字符串，也可能是对象；如果是字符串，不做处理；如果是对象，就需要将对象转换为字符串
        let data = ''; //保存请求携带的数据

        //如果config.data 是字符串
        if(Object.prototype.toString.call(config.data) == '[object String]'){
            data = config.data;
        }else{
            //如果config.data 是对象，又分为下面两种情况

            //如果是get ,delete请求，字符串最终需要放在URL地址上，格式 key = value & key =value；
            //如果是post，put请求，格式有可能是key =value 格式，也可能是JSON 格式
            if((config.type == 'post'|| config.type=='put') && config.contentType == 'application/json'){
                //设置请求参数为JSON格式
                data = JSON.stringify(config.data);
            }else{
                //走到这步，是get/delete/post/put 格式要是key = value 格式，但是config.data是对象
                //所以要遍历该对象，取出key 和value 值，做拼接处理
                for(let key in config.data){
                    data += `${key}=${config.data[key]}&`
                }
                //截取最后多的一个&
                data = data.substr(0,data.length-1);
            }
        }

        //获取Ajax对象
        let xhr = new XMLHttpRequest;
        //保存请求地址
        let url = config.url;
        if((config.type == 'get' || config.type == 'delete' ) && data){
            url = config.url+'?'+data;
        }
        //打开连接
        xhr.open(config.type,url);
        
        //设置请求头信息
        xhr.setRequestHeader('Content-Type',config.contentType);

        //发送请求
        //判断请求方式为post 或者put，并且data 中是否有参数需要携带，有就携带参数data，否则就传递空
        xhr.send(((config.type == 'post' || config.type == 'put' ) && data)?data:'');

        //监听状态改变
        xhr.onreadystatechange = function(){
            if(xhr.status == 200 && xhr.readyState == 4){
                //如果服务端返回的数据格式是JSON 格式的字符串，就转为对象
                let response = (config.dataType == 'json')?JSON.parse(xhr.responseText):xhr.responseText;
                //使用回调函数处理结果
                config.success(response)
            }
        }
    }



    /**
     * 
     * @param {String} key cookie 的名称
     * @param {String} value cookie 的值
     * @param {Number} expires 传递过期时间，单位为秒，默认值 0 表示关闭浏览器 cookie失效
     */
    function setCookie(key,value,expires=0){
        if(expires == 0){
            document.cookie = `${key}=${value};path=/`;
        }else{
            let d = new Date();
            d.setTime(d.getTime() - 8 * 3600 * 1000 + expires * 1000);
            document.cookie = `${key}=${value};path=/;expires=${d}`;
        }
    }


    /**
     * 
     * @param {String} key cookie 的名称
     */
    function removeCookie(key){
        setCookie(key,'',-1);
    }


    /**
     * 
     * @param {String} key cookie 的名称
     * @returns 
     */
    function getCookie(key){
        let value = '';
        document.cookie.split('; ').forEach(item=>{
            let keyValue = item.split('=');
            if(key == keyValue[0]){
                value = keyValue[1];
            }
        })
        return value;
    }